/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.citi.dahg.cve.controller.service.impl;

import com.citi.dahg.cve.controller.exceptions.SystemException;
import com.citi.dahg.cve.controller.model.Area;
import com.citi.dahg.cve.controller.model.Pais;
import com.citi.dahg.cve.controller.model.Periodo;
import com.citi.dahg.cve.controller.model.Recurso;
import com.citi.dahg.cve.controller.model.Vacacion;
import com.citi.dahg.cve.controller.service.BasicService;
import com.citi.dahg.cve.controller.service.local.AreaService;
import com.citi.dahg.cve.controller.service.local.ProgramacionService;
import com.citi.dahg.cve.controller.service.local.RecursoService;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.persistence.Query;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
/**
 *
 * @author dh90940
 */
@Stateless
public class RecursoServiceImpl extends BasicService<Recurso> implements RecursoService {

    @EJB
    private AreaService areaService;
    @EJB
    private ProgramacionService programacionService;
    @EJB
    private PeriodoServiceImpl periodoService;
    @EJB
    private PaisServiceImpl paisService;
    
    
    @Override
    protected Class<Recurso> getClazz() {
        return Recurso.class;
    }

    @Override
    protected String queryGetAll() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public List<Recurso> findLikeSoeid(String soeid) {
        String consulta = "select r from Recurso r where upper(r.soeid) like upper(:soeid)";
        Query query = getEntityManager().createQuery(consulta)
                .setParameter("soeid", soeid+"%");
        
        List<Recurso> lista = new ArrayList<Recurso>();
        lista.addAll(query .getResultList());
        return lista;
    }
    
    @Override
    public List<Recurso> findLikeName(String name) {
        String consulta = "select r from Recurso r where upper(r.nombre) like trim(upper(:nombre))";
        Query query = getEntityManager().createQuery(consulta)
                .setParameter("nombre", name+"%");
        
        List<Recurso> lista = new ArrayList<Recurso>();
        lista.addAll(query .getResultList());
        return lista;
    }
    
    @Override
    public List<Recurso> findLikeLastName(String lastName) {
        String consulta = "select r from Recurso r where upper(r.apellido) like upper(:lastName)";
        Query query = getEntityManager().createQuery(consulta)
                .setParameter("lastName", lastName+"%");
        
        List<Recurso> lista = new ArrayList<Recurso>();
        lista.addAll(query .getResultList());
        return lista;
    }

    @Override
    @Transactional(propagation= Propagation.REQUIRED,readOnly=false)
    public void createRecursoFromFile(Integer nFila, String fila) throws SystemException {
        SimpleDateFormat format = new SimpleDateFormat("dd-MM-yyyy");
        
        String[] fields = fila.split("\\|");
        
        String soeid=fields[0];
        String nombre = fields[1];
        String apellido = fields[2];
        
        String soeidSupervisor=fields[3];
        String nombreSupervisor = fields[4];
        String apellidoSupervisor = fields[5];
        String codPais=fields[6];
        String descripcionArea = fields[7];
        Integer idPeriodo = Integer.valueOf(fields[11]);
        boolean freeze = fields[12].equals("S");
        
        
        Date fechaIngreso = null;
        Date fechaInicio = null;
        Date fechaFin = null;
        
        Integer freezerAcumulado = Integer.valueOf(fields[13]);
        String comentarios = fields[14];
        
        try {
            fechaIngreso = format.parse(fields[8]);
        } catch (ParseException ex) {
            throw new SystemException("El formato fecha ingrseo ["+fields[8]+"] es invalido");
        }
        
        try {
            fechaInicio = format.parse(fields[9]);
        } catch (ParseException ex) {
            throw new SystemException("El formato fecha inicio vacacion ["+fields[9]+"] es invalido");
        }
        
        try {
            fechaFin = format.parse(fields[10]);
        } catch (ParseException ex) {
            throw new SystemException("El formato fecha fin vacacion ["+fields[10]+"] es invalido");
        }       
        
        Pais pais = null;
        pais = paisService.findById(codPais);
        if(pais==null) throw new SystemException("No existe pais "+codPais);
        
        Periodo periodo = null;
        periodo = periodoService.findById(idPeriodo);
        if (periodo==null)
            throw new SystemException("No existe periodo "+idPeriodo);
        
        //Se verifica si existe el area;
        Area area = new Area(descripcionArea.toUpperCase());
        area.setPais(pais);
        areaService.update(area);        
        
        Recurso recursoSupervisor=null;
        if (!soeidSupervisor.isEmpty()) {            
            recursoSupervisor = findById(soeidSupervisor);        

            if (recursoSupervisor==null) {
                recursoSupervisor = new Recurso(soeidSupervisor, nombreSupervisor.toUpperCase(), apellidoSupervisor.toUpperCase(), area, new Date());
                recursoSupervisor.setIsSupervisor(true);
                recursoSupervisor.setAcumulado(0);
                update(recursoSupervisor);
            }
        }
        
        Recurso empleado = null;
        empleado = findById(soeid);
        if (empleado==null) {
            empleado = new Recurso(soeid, nombre.toUpperCase(), apellido.toUpperCase(), area, fechaIngreso);
            empleado.setIsSupervisor(false);
            empleado.setSupervisor(recursoSupervisor);
            empleado.setAcumulado(freezerAcumulado);            
            update(empleado);
        }
        
        getEntityManager().flush();
        
        Vacacion vacacion=new Vacacion();
        vacacion.setComentarios(comentarios);
        vacacion.setInicioProgramada(fechaInicio);
        vacacion.setInicioReal(fechaInicio);
        vacacion.setFinProgramada(fechaFin);
        vacacion.setFinReal(fechaFin);
        vacacion.setIsFreeze(freeze);
        vacacion.setPeriodo(periodo);
        vacacion.setRecurso(empleado);
        programacionService.add(vacacion);
    }
    
    
    
}
